package com.hfb.mashibing.alip8.designpattern._12proxy;

import java.util.Random;
import java.util.concurrent.TimeUnit;
import lombok.AllArgsConstructor;

/**
 * Q：现有如下代码，问题：我想记录坦克的移动时间，该怎么做？
 * A：修改源码，做时间记录 V2
 * Q：那如果无法修改源码的情况下，如何实现呢？V3
 * A：用继承,继承他的实现类 V4
 * Q：应该用代理吧 V5 (持有代理对象实现类的引用，并实现代理接口)
 */

public class V5Tank implements MovableV5 {
    public static void main(String[] args) {
        MovableV5 tank = new TankTimeProxyV5(new V5Tank());
        tank.move();
    }


    @Override
    public void move() {
        System.out.println("tank is moving.......");
        try {
            TimeUnit.SECONDS.sleep(new Random().nextInt(5));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

/**
 * 代理模式
 */
@AllArgsConstructor
class TankTimeProxyV5 implements MovableV5 {
    private V5Tank tank;

    @Override
    public void move() {
        long s = System.currentTimeMillis();

        tank.move();

        System.out.printf("tank moved time is %s ms.\n", (System.currentTimeMillis()-s));
    }
}

interface MovableV5 {
    void move();
}
